Workshop
;Datei       : listing9.asm
;Beschreibung: Eine Bitplane (640 x 256) mit Muster die hoch und
;              runter scrollt.
;Autor       : Enrico Bauermeister
;Datum       : 16.12.1997
;Assembler   : TFA AsmOne v1.30
;===============================================================

;Interrupts sperren - Betriebssystem ausschalten
;-----------------------------------------------
 move.w   #$4000,$dff09a

;Sprites ausschalten (sonst stören die nur)
;------------------------------------------
 move.w   #$0020,$dff096

;Adresse der Bitplane in die Bitplanepointer eintragen
;-----------------------------------------------------
;Zuerst wird das Low-Word in $dff0e2 und anschließend das High-Word in
;$dff0e0 eingetragen.
;-----------------------------------------------------
 move.l   #bitplane,d0          ;Bitplane-Aresse nach d0
 move.w   d0,bitplanepointer+6  ;Low-Word eintragen
 swap     d0                    ;Words in d0 vertauschen
 move.w   d0,bitplanepointer+2  ;High-Word eintragen

;Copperliste aktivieren
;----------------------
 move.l   #Copperliste,$dff084

;Muser erzeugen
;--------------
 bsr.w    muster

;Warten auf Rasterstrahl (eine 1/50 Sekunde)
;-------------------------------------------
wait:
 move.l   $dff004,d0
 and.l    #$fff00,d0
 cmp.l    #$00003000,d0
 bne.s    wait

;Bildschirm scrollen
;-------------------
 bsr.w    scroll

;Linke Maustaste gedrückt ?
;--------------------------
 btst     #6,$bfe001
 bne.s    wait

;Sprites wieder einschalten
;--------------------------
 move.w   #$8020,$dff096

;Interrupts wieder erlauben
;--------------------------
 move.w   #$c000,$dff09a

;Programmende
;------------
 moveq    #0,d0
 rts

;Datenbereich
;------------
richtung: dc.b 0,0
wieoft:   dc.w 0

;Routine um ein Muster auf der Bitplane zu erzeugen
;--------------------------------------------------
muster:
 lea      bitplane,a0    ;Adresse der Bitplane
 moveq    #8-1,d0        ;8 Paare von 16 Punkten hohen Quadraten
                         ;(jedes Paar (ein schwarzes und ein weißes
                         ; Quadrat) ist 32 Punkte hoch -> 8 Paare
                         ; davon untereinander und die Bitplane ist
                         ; voll (256 Punkte hoch))
mpaar:
 move.l   #(20*16)-1,d1  ;20 Paare um eine Zeile zu füllen (640 Punkte)
                         ;16 Zeilen sind zu füllen
meins:
 move.l   #%11111111111111110000000000000000,(a0)+  ;Bits in der Bitplane
 dbra     d1,meins ;Mit "dbra" kann man Zähl-       ;setzen
                   ;schleifen in Assembler
                   ;realisieren. Bei dieser
                   ;Anweisung wird D1 bis auf
                   ;-1 runtergezählt. Ist D1
                   ;noch nicht -1, so wird zum
                   ;Label "meins" gesprungen.
                   ;Eine DBRA-Schleife zählt
                   ;also immer bis -1 und nicht
                   ;bis 0.
 move.l   #(20*16)-1,d1  ;20 Paare um eine Zeile zu füllen (640 Punkte)
                         ;16 Zeilen sind zu füllen
mzwei:
 move.l   #%00000000000000001111111111111111,(a0)+  ;Bits in der Bitplane
 dbra     d1,mzwei                                  ;setzen
 dbra     d0,mpaar
 rts

;Routine um den Bildschirm zu scrollen
;-------------------------------------
;Die Bitplane wird 320 Punkte gescrollt. Ob wir rechts oder links scrollen
;müssen, merken wir uns in "richtung". In "wieoft" merken wir uns die
;Anzahl gescrollter Punkt.
;-------------------------------------
scroll:
;Bitplanepointer auslesen
;++++++++++++++++++++++++
 lea      bitplanepointer,a1    ;Bitplanepointer nach A1
 move.w   2(a1),d0;             ;High-Word auslesen
 swap     d0                    ;Words vertauschen
 move.w   6(a1),d0              ;Low-Word auslesen
;++++++++++++++++++++++++
 addq.w   #1,wieoft             ;"wieoft" um 1 erhöhen
 cmp.w    #320,wieoft           ;Schon 320 punkte gescrollt ?
 bne.s    scrollen_starten      ;wenn nicht -> Screen scrollen
 bchg.b   #1,richtung           ;wenn doch -> Bit 1 von "richtung" tauschen
                                ;(aus 0 eine 1, aus 1 eine 0)
 clr.w    wieoft                ;"wieoft" löschen
 rts
scrollen_starten:
 btst     #1,richtung           ;Bit 1 von "richtung" testen
 beq.s    scrolle_links         ;Bit ist 0 -> links scrollen
 bsr.s    scrolle_rechts        ;Bit ist 1 -> nach rechts scrollen
 rts
scrolle_links:
 tst.b    con                   ;Min. Scroll erreicht ?
 bne.s    scrolle_ein_pixel_nach_links ;wenn nicht...
 addq.l   #2,d0                 ;16 Bit weiter vorne pointen
                                ;(16 Punkte nach links scrollen)
 move.b   #$ff,con              ;Hardware-Scroll löschen
 bra.s    scrollende
scrolle_ein_pixel_nach_links:
 sub.b    #$11,con
 rts
scrolle_rechts:
 cmpi.b   #$ff,con              ;Max. Scroll erreicht ?
 bne.s    scrolle_ein_pixel_nach_rechts  ;wenn nicht...
 subq.l   #2,d0                 ;16 Bit weiter hinten pointen
                                ;(16 Punkte nach rechts scrollen)
 clr.b    con                   ;Hardware-Scroll löschen
 bra.s    scrollende
scrolle_ein_pixel_nach_rechts:
 add.b    #$11,con
 rts
;Bitplanepointer neu eintragen
;+++++++++++++++++++++++++++++
scrollende:
 move.w   d0,6(a1)              ;Low-Word eintragen
 swap     d0                    ;Words vertauschen
 move.w   d0,2(a1)              ;High-Word eintragen
 rts

;Copperliste
;-----------
 SECTION Cl,CODE_C
Copperliste:
 dc.w     $008e,$2c81  ;DIWSTRT
 dc.w     $0090,$2cc1  ;DIWSTOP
 dc.w     $0092,$0030  ;DDFSTRT - wegen Scroll geändert
 dc.w     $0094,$00d0  ;DDFSTOP
 dc.w     $0100,$1200  ;BPLCON0
 dc.w     $0102        ;BPLCON1
 dc.b     $00          ;höherwertige Byte von BPLCON1
con:
 dc.b     $00          ;niederwertige Byte von BPLCON1
 dc.w     $0108,$0026  ;BPL1MOD - Für die 640 Punkte breite Bitplane muß
                       ;          der Wert 40 ($28) eingetragen werden.
                       ;          Aber um DDFSTRT wieder auszugleichen,
                       ;          welches ja ein Word (2 Byte) früher
                       ;          startet, muß wieder 2 vom Wert abgezogen
                       ;          werden, also 38 ($26).
 dc.w     $010a,$0026  ;BPL2MOD - siehe BPL1MOD
bitplanepointer:
 dc.w     $00e0,$0000  ;BPL1PTH
 dc.w     $00e2,$0000  ;BPL1PTL
 dc.w     $0180,$0000  ;COLOR00
 dc.w     $0182,$0fff  ;COLOR01
 dc.w     $ffff,$fffe  ;Copperlistenende

;Bitplane
;--------
 SECTION Bp,BSS_C
bitplane:
 ds.b     20480

 END

Zurück zum Programmierkurs